#include <iostream>
#include <vector>
#include <string>
#include <unistd.h>
#include <thread>

void threadrun(std::string name, int cnt)
{
    while (cnt--)
    {
        std::cout << "cnt:" << cnt << " " << name << std::endl;
        sleep(1);
    }
}
int main()
{
    std::string name = "thread-1";
    std::thread mythread(threadrun, name, 5);

    while (true)
    {
        std::cout << "main thread running..." << std::endl;
        sleep(1);
    }
    mythread.join();
    return 0;
}

// std::string PrintToHex(pthread_t tid)
// {
//     char buf[128];
//     snprintf(buf, sizeof(buf), "0x%lx", tid);
//     return buf;
// }
// class ThreadData
// {
// public:
//     int Excute()
//     {
//         return x + y;
//     }

// public:
//     std::string name;
//     int x;
//     int y;
// };

// class ThreadResult
// {
//     std::string Print()
//     {
//         return std::to_string(x) + "+" + std::to_string(y) + "=" + std::to_string(result);
//     }

// public:
//     int x;
//     int y;
//     int result;
// };

// void *threadrun(void *arg)
// {
//     pthread_detach(pthread_self());//新线程分离自己
//     while (true)
//     {
//         std::cout << static_cast<const char *>(arg) << std::endl;
//         sleep(3);
//         break;
//     }
//     // exit(1);
//     sleep(50);
//     // pthread_exit((void *)"hello");
//     return arg;
// }
// int main()
// {
//     // 问题6: 如何创建多线程呢？
//     std::vector<pthread_t> tids;
//     for (int i = 0; i < 10; i++)
//     {
//         // 1.线程的id
//         pthread_t tid;
//         // 2.线程等待名字
//         char *name = new char[128];
//         snprintf(name, 128, "thread-%d", i);
//         pthread_create(&tid, nullptr, threadrun, (void *)name);
//         tids.emplace_back(tid);
//     }

//     sleep(3);
//     // 等待创建的新线程
//     for (auto tid : tids)
//     {
//         // int ret = pthread_cancel(tid); //取消正在运行的线程
//         void *res = nullptr;
//         int n = pthread_join(tid, &res); //等待分离的线程,获取返回值
//         std::cout << "pthread_join return value:" << n << std::endl;

//         // std::cout << "pthred_cancel return value:" << (long long int)res << std::endl;

//         // std::cout << "arg::" << (const char *)res << " tid: " << tid << " quit..." << std::endl;
//     }

//     sleep(100);
//     return 0;
// }

// 新线程跑的函数
// void *threadrun(void *arg)
// {
//     ThreadData *td = static_cast<ThreadData *>(arg); // 比较温和的类型转化
//     ThreadResult *res = new ThreadResult();
//     while (true)
//     {
//         sleep(3);
//         std::cout << td->name << std::endl;
//         res->x = td->x;
//         res->y = td->y;
//         res->result = td->Excute();
//         // std::cout << (const char *)arg << std::endl;
//         // sleep(1);
//         break;
//     }
//     delete td;
//     return (void *)res;
// }
// int main()
// {
//     // 问题1: main 和 new 线程谁先运行？不确定

//     pthread_t tid;
//     // 问题4：全面看待线程函数传参: 我们可以传递任意类型，但你一定要能想得起来，也可以传递类对象的地址！！！
//     ThreadData *td = new ThreadData();
//     td->name = "thread-1";
//     td->x = 1;
//     td->y = 1;
//     pthread_create(&tid, nullptr, threadrun, (void *)td);

//     while (true)
//     {
//         std::cout << "main thread run..." << std::endl;
//         sleep(1);
//         break; // 主线程退出,代表整个进程退出了,地址空间和页表这些都释放了
//     }

//     // 问题3: tid 是什么样子的？是什么呢？虚拟地址！ 为什么? TODO
//     // std::cout << "tid: " << PrintToHex(tid) << std::endl;
//     // 问题2：我们期望谁最后退出？ main thread,你如何保证呢？
//     ThreadResult *res = nullptr;
//     int ret = pthread_join(tid, (void **)&res);
//     if (ret == 0)
//     {
//         std::cout << "main thread wait success.new thread exit code:" << res->result << std::endl;
//     }
//     return 0;
// }